/**
 * @p.md
 * 
 * 集群提供者接口
 */
import { Cluster } from './cluster';
import { Member, MemberStatus } from './clusterConfig';

/**
 * 集群提供者事件类型
 */
export enum ClusterProviderEventType {
  MemberJoined = 'member-joined',
  MemberLeft = 'member-left',
  MemberAvailable = 'member-available',
  MemberUnavailable = 'member-unavailable',
  LeaderElected = 'leader-elected'
}

/**
 * 集群提供者事件接口
 */
export interface ClusterProviderEvent {
  /**
   * 事件类型
   */
  type: ClusterProviderEventType;
  
  /**
   * 相关成员
   */
  member?: Member;
  
  /**
   * 领导节点ID（仅用于LeaderElected事件）
   */
  leaderId?: string;
  
  /**
   * 事件时间戳
   */
  timestamp: number;
  
  /**
   * 事件元数据
   */
  metadata?: any;
}

/**
 * 集群提供者接口
 * 负责集群成员的发现、监控和管理
 */
export interface ClusterProvider {
  /**
   * 初始化提供者
   * @param cluster 集群引用
   */
  init(cluster: Cluster): Promise<void>;
  
  /**
   * 启动提供者
   */
  start(): Promise<void>;
  
  /**
   * 关闭提供者
   */
  shutdown(): Promise<void>;
  
  /**
   * 注册本节点到集群
   * @param address 节点地址
   * @param metadata 节点元数据
   */
  registerMember(address: string, metadata?: any): Promise<void>;
  
  /**
   * 注销本节点
   */
  unregisterMember(): Promise<void>;
  
  /**
   * 获取集群所有成员
   */
  getMembers(): Promise<Member[]>;
  
  /**
   * 根据ID获取成员
   * @param memberId 成员ID
   */
  getMemberById(memberId: string): Promise<Member | null>;
  
  /**
   * 监控成员状态变化
   */
  monitorMemberStatusChanges(): void;
  
  /**
   * 获取集群元数据
   */
  getClusterMetadata(): Promise<any>;
  
  /**
   * 获取是否为领导节点
   */
  isLeader(): Promise<boolean>;
  
  /**
   * 获取当前领导节点信息
   */
  getLeader(): Promise<Member | null>;
  
  /**
   * 注册事件监听器
   * @param listener 事件监听回调
   */
  registerEventListener(listener: (event: ClusterProviderEvent) => void): void;
  
  /**
   * 移除事件监听器
   * @param listener 事件监听回调
   */
  removeEventListener(listener: (event: ClusterProviderEvent) => void): void;
} 